// Copyright (c) 2010, Anthony Cassidy
// All rights reserved.
// 
// Redistribution and use in source and binary forms, with or without modification, are 
// permitted provided that the following conditions are met:
// 
//     * Redistributions of source code must retain the above copyright notice, this list 
//         of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above copyright notice, this 
//         list of conditions and the following disclaimer in the documentation and/or 
//         other materials provided with the distribution.
//     * Neither the name of the AntsAdventureGameCreator nor the names of its contributors 
//         may be used to endorse or promote products derived from this software without 
//         specific prior written permission.
// 
// 
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 
// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 
// SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 
// THE POSSIBILITY OF SUCH DAMAGE.

/*!
@page Example8
<h1>Example 8 - Adding compile-time type checking for Keyword parameters</h1>
<h2>Summary</h2>
In Example7 the possibility of mis-typing RoomObject keywords
was minimized by the use of the ROOMDECLARATION_WITH_CODES() macro.
But there still exist possibilities for error by mis-typing
keyword strings for use in method calls.
<br>
<br>
To remedy this, there exists three macros OBJ(), INV() and ANIM()
that can be used to enable compile time checking of valid keywords.
<br>
<h2> Steps </h2>
<ol>

<li>
OBJ() can be used to add compile-time type checking for methods on RoomObjects.
<br>
For Example:
@code
GetRoom().Objects().At("teapot").SetVisible(false);
@endcode
can be replaced with:
@code
OBJ(teapot).SetVisible(false);
@endcode
</li>


<li>
INV() can be used to add compile-time type checking for methods on InventoryItems.
<br>
For Example:
@code
GetInventory().Items().At("inv_teapot").SetVisible(true);
@endcode
can be replaced with:
@code
INV(inv_teapot).SetVisible(true);
@endcode
</li>



<li>
ANIM() can be used to add compile-time type checking for methods on Animations.
<br>
For Example:
@code
GetRoom().Objects().At("man").Animations().At("walk_left").SetSpecialAnimation(West);
@endcode
can be replaced with:
@code
ANIM(man,walk_left).SetSpecialAnimation(West);
@endcode
</li>

</ol>
The code below is the code taken from main7.cpp and converted using the above macros.<br>
You will find the converted code in main8.cpp
@includelineno main8.cpp

<br>
On to @ref Example9...
<br>
*/

